package cn.itcast.nems.product.dao.entity;

import cn.itcast.nems.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;

/**
 * <p>
 * 产品
 * </p>
 *
 * @author liyong
 * @since 2023-08-31
 */
@Getter
@Setter
@TableName("e2_product")
public class Product extends BaseEntity {

    /**
     * 产品编号：跨租户全局唯一。默认生成规则：ZEROFILL(MURMURHASH(UUID()),0,10)，如9815112404
     */
    private Long id;

    /**
     * 业务关联编号：由业务决定，是业务系统实体关联字段。主租户内必须唯一！
     */
    private String bizNo;

    /**
     * 产品名称
     */
    private String name;

    /**
     * 产品标题：默认与产品名称一致。可用作列表内的特殊显示。
     */
    private String title;

    /**
     * 划线价/原价。单位：分
     */
    private Integer listPrice;

    /**
     * 库存数量：当前实物库存数，或面授课程坐席。无库存限制时值为-9。
     */
    private Integer quantity;

    /**
     * 实际出售数量：售出递增、退货递减。注：未支付订单也应算库存数量，否则无法起到“占座”的作用。
     */
    private Integer quantitySold;

    /**
     * 供C端页面显示的售出数量，可作调整
     */
    private Integer listQuantitySold;

    /**
     * 库存超卖标识：0不允许超出库存出售、1允许超出库存出售
     */
    private Boolean oversoldFlag;

    /**
     * 库存超卖数量上限：该值为 库存数+超卖数量。在允许库存超卖的情况下，可以此值来控制库存。
     */
    private Integer oversoldQuantity;

    /**
     * 状态：未上架|PENDING、已上架|VALID、已下架|INVALID
     */
    private String state;

    /**
     * 产品图片url，由业务功能决定是否需要有默认图片地址
     */
    private String imageUrl;

    /**
     * 产品banner图片url/大图
     */
    private String coverImageUrl;

    /**
     * 自定义链接跳转地址
     */
    private String linkUrl;

    /**
     * 产品简介
     */
    private String intro;

    /**
     * 校区ID：冗余字段，只有短训使用。
     */
    private String campusId;

    /**
     * 校区名字：冗余字段，只有短训使用。
     */
    private String campusName;

    /**
     * 授课模式ID：冗余字段，只有短训使用。
     */
    private String modelId;

    /**
     * 授课模式名：冗余字段，只有短训使用。
     */
    private String modelName;

    /**
     * 学科ID：冗余字段，只有短训使用。
     */
    private String subjectId;

    /**
     * 学科名：冗余字段，只有短训使用。
     */
    private String subjectName;

    /**
     * 班级类型名ID：冗余字段，只有短训使用。
     */
    private String classTypeId;

    /**
     * 班级类型名：冗余字段，只有短训使用。
     */
    private String classTypeName;

    /**
     * 排序号：用于产品列表里排序，按照值大小倒序。默认999，需要“置顶”操作时可改为比999小的值。
     */
    private Integer sort;

    /**
     * 生效日期，可作为班级的开班日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @JsonSerialize(using = LocalDateSerializer.class)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    private LocalDate effectiveDatetime;

    /**
     * 过期日期，可作为班级的结课日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @JsonSerialize(using = LocalDateSerializer.class)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    private LocalDate expireDatetime;

    /**
     * 课程备注
     */
    private String remark;

}
